package com.java8;

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        String value = "Hello, world!";

        // 创建一个包含非空值的Optional对象
        Optional<String> optional1 = Optional.of(value);

        // 获取Optional对象中的值
        String result1 = optional1.get();
        System.out.println(result1);  // 输出：Hello, world!

        // 创建一个可能为空的Optional对象
        Optional<String> optional2 = Optional.ofNullable(null);

        // 判断Optional对象是否包含值
        boolean isPresent = optional2.isPresent();
        System.out.println(isPresent);  // 输出：false

        // 如果Optional对象包含值，则执行指定的操作
        optional1.ifPresent(val -> System.out.println(val));  // 输出：Hello, world!

        // 如果Optional对象为空，则返回默认值
        String result2 = optional2.orElse("Default Value");
        System.out.println(result2);  // 输出：Default Value

        // 如果Optional对象为空，则执行指定的操作并返回结果
        String result3 = optional2.orElseGet(() -> "Default Value");
        System.out.println(result3);  // 输出：Default Value

        // 如果Optional对象为空，则抛出指定的异常
        try {
            optional2.orElseThrow(() -> new IllegalArgumentException("Value is not present"));
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());  // 输出：Value is not present
        }
        System.out.println("-------------------------------------------------------------------------");
        String str = "Hello, World!";

        Optional<String> optionalStr = Optional.ofNullable(str);

        System.out.println("str的值为：" + optionalStr.get());

        // 使用orElse方法提供默认值
        String defaultValue = optionalStr.orElse("默认值");
        System.out.println("str的值为：" + defaultValue);

        // 使用orElseGet方法提供默认值的计算逻辑
        String computedValue = optionalStr.orElseGet(() -> {
            // 计算默认值的逻辑
            return "计算后的默认值";
        });
        System.out.println("str的值为：" + computedValue);

        // 使用map方法对Optional对象进行转换
        Optional<Integer> optionalLength = optionalStr.map(String::length);
        if (optionalLength.isPresent()) {
            System.out.println("str的长度为：" + optionalLength.get());
        } else {
            System.out.println("str为空");
        }

        // 使用flatMap方法对Optional对象进行转换
        Optional<String> optionalUpperCase = optionalStr.flatMap(s -> Optional.ofNullable(s.toUpperCase()));
        if (optionalUpperCase.isPresent()) {
            System.out.println("str转换为大写后的值为：" + optionalUpperCase.get());
        } else {
            System.out.println("str为空");
        }

    }

}